#include <stdafx.h>
#include <windows.h>

#define SLEEP_TIME (5000)
#define LOGFILE ("C:\\abc.txt")

SERVICE_STATUS ServiceStatus; 
SERVICE_STATUS_HANDLE hStatus; 

void ServiceMain(int argc, char** argv); 
void ControlHandler(DWORD request); 
int InitService();

int WriteToLog(char* str)
{
    FILE* fp = fopen(LOGFILE , "a+");

    if(NULL==fp)
        return -1;

    fprintf(fp,"%s\n",str);
    fclose(fp);

    return 0;
}

void ServiceMain(int argc, char** argv)   
{   
    int error;   

    ServiceStatus.dwServiceType = SERVICE_WIN32;   
    ServiceStatus.dwCurrentState = SERVICE_START_PENDING;   
    ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;  
    ServiceStatus.dwWin32ExitCode = 0;   
    ServiceStatus.dwServiceSpecificExitCode = 0;   
    ServiceStatus.dwCheckPoint = 0;   
    ServiceStatus.dwWaitHint = 0;   

    hStatus = RegisterServiceCtrlHandler( "MemoryStatus",(LPHANDLER_FUNCTION)ControlHandler);   
    if (hStatus == (SERVICE_STATUS_HANDLE)0)   
    {   
        // Registering Control Handler failed  
        return;   
    }    
    // Initialize Service   
    error = InitService();   
    if (error)   
    {  
        // Initialization failed  
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;   
        ServiceStatus.dwWin32ExitCode = -1;   
        SetServiceStatus(hStatus, &ServiceStatus);
        return;
    }   
    // We report the running status to SCM.   
    ServiceStatus.dwCurrentState = SERVICE_RUNNING;   
    SetServiceStatus (hStatus, &ServiceStatus);  

    MEMORYSTATUS memory;  
    // The worker loop of a service  
    while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
    {  
        char buffer[16];  
        GlobalMemoryStatus(&memory);  
        sprintf(buffer, "%d MB", memory.dwAvailPhys/(1024*1024));  
        int result = WriteToLog(buffer);  
        if (result)  
        {
            ServiceStatus.dwCurrentState = SERVICE_STOPPED;   
            ServiceStatus.dwWin32ExitCode = -1;   
            SetServiceStatus(hStatus,&ServiceStatus);  
            return;  
        }  
        Sleep(SLEEP_TIME);  
    }  
    return;   
}

void ControlHandler(DWORD request)   
{   
    switch(request)   
    {   
    case SERVICE_CONTROL_STOP:   
        WriteToLog("Monitoring stopped.");  

        ServiceStatus.dwWin32ExitCode = 0;   
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;   
        SetServiceStatus (hStatus, &ServiceStatus);  
        return;   

    case SERVICE_CONTROL_SHUTDOWN:   
        WriteToLog("Monitoring stopped.");  

        ServiceStatus.dwWin32ExitCode = 0;   
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;   
        SetServiceStatus (hStatus, &ServiceStatus);  
        return;   

    default:  
        break;  
    }   

    // Report current status  
    SetServiceStatus (hStatus, &ServiceStatus);  

    return;   
}  

int InitService()
{
    int nResult = 0;
    nResult = WriteToLog("Monitoring started.");
    return nResult;
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("helloworld\n");

    SERVICE_TABLE_ENTRY ServiceTable[2];
    ServiceTable[0].lpServiceName = "MemoryStatus";
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;

    StartServiceCtrlDispatcher(ServiceTable);

    return 0;
}